#ifndef HASHMAP_H
#define HASHMAP_H

#ifdef __cplusplus
extern "C" {
#endif

struct hashmap;
typedef struct hashmap hashmap_t;

/*
 * hash函数：由key生成数值，将用于计算对应的桶序号
 * @param   key 关键字
 * @return 数值
 */
typedef unsigned (*hashmap_hash_func)(const void *);
unsigned hashmap_default_string_key_func(const void *s);

/*
 * 比较key函数：比较key大小
 * @param   a: 一个key
 * @param   b: 另一个key
 * @return 0代表相等，1代表a>b, -1代表a<b
 */
typedef int (*hashmap_key_comp_func)(const void *, const void *);
int hashmap_default_string_cmp_func(const void *a, const void *b);


/*
 * 初始化
 * @param hash_func     hash函数    填NULL,将使用hashmap_default_string_key_func
 * @param comp_func     compare函数 填NULL, 将使用hashmap_default_string_cmp_func
 * @return hashmap_t *  map指针或NULL
 */
hashmap_t *hashmap_init(hashmap_hash_func hash_func, hashmap_key_comp_func comp_func);

/*
 * 添加
 * @param hp        map指针
 * @param key       key
 * @param value     value
 * @return          1表示成功，0表示失败
 * @note  key必须唯一
 */
int hashmap_add(hashmap_t *hp, const void *key, void *obj);

/*
 * 删除
 * @param hp        map指针
 * @param key       key
 * @return          1表示成功，0表示失败，一般是因为未找到
 */
int hashmap_del(hashmap_t *hp, const void *key);

/*
 * 查找
 * @param hp        map指针
 * @param key       key
 * @return          value或NULL
 */
void *hashmap_find(hashmap_t *hp, const void *key);

/* ---------------------------------------------------------------- */
/* hashmap_first_value(), hashmp_next_value()用于快速遍历添加条目 
 * 使用方法如下
 * value_t *val = NULL;
 * for (value=hashmap_first_value(hp); value; value=hashmp_next_value(hp)) {
 *     // process value
 * }
 */ 
/* 获取首个保存的条目的value */
void *hashmap_first_value(hashmap_t *hp);

/* 获取下一个保存的条目value，无下一个条目时返回NULL */
void *hashmap_next_value(hashmap_t *hp);
/* ---------------------------------------------------------------  */

/*
 * 获取条目数
 */
int hashmap_num_entry(hashmap_t *hp);

/*
 * 遍历回调函数指针
 * key          key
 * value        value
 * priv         私有参数
 */
typedef void (*hash_walk_func)(const void *, const void *, void *priv);

/*
 * 遍历函数
 * @param   hp          map指针
 * @param   walker      回调函数
 * @param   priv        回调函数参数
 */
void hashmap_walk(hashmap_t *hp, hash_walk_func walker, void *priv);

/*
 * 销毁
 * @param   hp      map指针
 * @return  永远返回1
 */
int hashmap_destroy(hashmap_t *hp);


//-----------------------------------------------------------------------------------
/*
 * dump_entry函数指针
 * key          key
 * value        value
 * priv         私有参数
 */
typedef void (*hash_dump_entry_func)(const void *, const void *, void *priv);

void hashmap_dump(hashmap_t *hp, hash_dump_entry_func func, void *priv);
//-----------------------------------------------------------------------------------

#ifdef __cplusplus
}
#endif

#endif
